<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * 角色&权限管理控制器
 * 
 * @desc    角色管理 & 权限管理
 * @version 1.0.0 
 * @author  Jason
 * @date    2017年6月23日 下午4:44:00
 * 
 * @desc    完善文档注释
 * @version 1.1.0
 * @date	2017年6月27日 下午5:41:36
 *
 * @title 角色&权限管理
 * @entry http://discovery.segway.com
 */
class Role extends MY_Manager_Controller
{
	/** @var Lib_role */
	public $lib_role = null;
	
	public function __construct()
	{
		parent::__construct();
		
		$this->load->library('lib_role');
		
		$this->set_mutable_view_var('head.title', 'Role - Management');
		$this->set_mutable_view_var('head.keywords', '');
		$this->set_mutable_view_var('head.description', '');
		
		$this->lang->load('role');
	}
	
	/**
	 * 首页 -> 列表页
	 *
	 * @return html
	 *
	 * @command pass noneurl
	 */
	public function index()
	{
		$this->listing();
	}
	
	/**
	 * 角色列表页
	 * 
	 * @desc    listing
	 * @author  Jason
	 * @date	2017年6月20日 下午4:23:10
	 * @link    /manage/role/listing
	 */
	public function listing($page = 1, $number = 20)
	{
		$conditions = $this->lib_role->get_conditions();
		$list = $this->lib_role->get_roles_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		$this->load->view('manager/role/list', $data);
	}
	
	/**
	 * Action 列表页
	 *
	 * @desc    权限 URL 列表页（ Action 列表页）
	 * @author  Jason
	 * @date	2017年6月20日 下午4:40:28
	 * @link    /manage/role/listing_action
	 */
	public function listing_action($page = 1, $number = 20)
	{
		// MARK 这里可能需要加上 $mapping 参数
		$conditions = $this->lib_role->get_conditions();
		$list = $this->lib_role->get_actions_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		$this->load->view('manager/role/list_action', $data);
	}
	
	/**
	 * 角色 ACL 列表页（访问控制列表）
	 *
	 * @desc    角色 ACL 列表页（访问控制列表）：角色与Action关联 的列表页，或曰角色与权限URL关联 的列表页
	 * @author  Jason
	 * @date	2017年6月20日 下午4:46:53
	 * @link    /manage/role/listing_acl
	 */
	public function listing_acl($page = 1, $number = 20)
	{
		// MARK 这里可能需要加上 $mapping 参数
		$conditions = $this->lib_role->get_conditions();
		$list = $this->lib_role->get_acls_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		$this->load->view('manager/role/list_acl', $data);
	}
	// MARK ajax 列表页
	/**
	 * 角色列表页，ajax，JSON
	 *
	 * @desc    ajax_listing
	 * @author  Jason
	 * @date	2017年6月20日 下午4:23:10
	 * @link    /manage/role/ajax_listing
	 */
	public function ajax_listing($page = 1, $number = 20)
	{
		$conditions = $this->lib_role->get_conditions();
		$list = $this->lib_role->get_roles_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		Lib_json::renderSuccess($data);
	}
	
	/**
	 * Action 列表页，ajax，JSON
	 *
	 * @desc    权限 URL 列表页（ Action 列表页）
	 * @author  Jason
	 * @date	2017年6月20日 下午4:40:28
	 * @link    /manage/role/ajax_listing_action
	 */
	public function ajax_listing_action($page = 1, $number = 20)
	{
		// MARK 这里可能需要加上 $mapping 参数
		$conditions = $this->lib_role->get_conditions();
		$list = $this->lib_role->get_actions_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		Lib_json::renderSuccess($data);
	}
	
	/**
	 * 角色 ACL 列表页（访问控制列表），ajax，JSON
	 *
	 * @desc    角色 ACL 列表页（访问控制列表）：角色与Action关联 的列表页，或曰角色与权限URL关联 的列表页
	 * @author  Jason
	 * @date	2017年6月20日 下午4:46:53
	 * @link    /manage/role/ajax_listing_acl
	 */
	public function ajax_listing_acl($page = 1, $number = 20)
	{
		// MARK 这里可能需要加上 $mapping 参数
		$conditions = $this->lib_role->get_conditions();
		$list = $this->lib_role->get_acls_for_list($conditions, $page, $number);
		$data['list'] = $list;
		
		Lib_json::renderSuccess($data);
	}
	
	/**
	 * 角色详情
	 * 
	 * @desc    角色详情 - 编辑前信息载入
	 * @method  GET
	 * @author  Jason
	 * @date	2017年6月20日 下午4:51:45
	 * 
	 * @param   number $id       ID，默认为 0，代表新增一条记录
	 * 			把参数按顺序辍到 URL 之后，用 "/" 间隔
	 * @example 如果参数为 id=2
	 * 			那么URL为 /manage/role/detail/2
	 * 
	 * @link    /manage/role/detail
	 * 
	 * @demoParam id 2
	 */
	public function detail($id = 0)
	{
		$role = $this->lib_role->get_role_for_detail($id);
		if (empty($role)) {
			$role = [];
		}
		
		$actions = $this->lib_role->get_actions_for_list(array(), 1, 10000)['data'];
		$actionGroup = [];
		foreach($actions as $action) {
			$uniqueKey = $action['group_code'] ?: 'other';
			if (empty($actionGroup[$uniqueKey]['group']['name'])) {//判断name，尝试取任意一个非空name值。认为code不为空！
				$actionGroup[$uniqueKey]['group']['code'] = $action['group_code'];
				$actionGroup[$uniqueKey]['group']['name'] = $action['group_name'];
			}
			$actionGroup[$uniqueKey]['actions'][] = [
					'id' => $action['id'],
					'code' => $action['code'],
					'name' => $action['name'],
					'desc' => $action['description'],
			];
		}
		
		// 将未分组的权限移到最后
		if (array_key_exists('other', $actionGroup)) {
			$other = $actionGroup['other'];
			unset($actionGroup['other']);
			$actionGroup['other'] = $other;
		}
		
		$conditions = [
				['select', 'id'],
				['where', "role_id=$id"],
		];
		$acl = $this->lib_role->get_acls_for_list($conditions, 1, 10000)['data'];
		$acl = array_column($acl, 'id');
		
		$data['content']['role'] = $role;
		$data['content']['action_group'] = $actionGroup;
		$data['content']['acl'] = $acl;
		
		$this->load->view('manager/role/detail', $data);
	}
	
	/**
	 * Action详情
	 *
	 * @desc    Action详情 - 编辑前信息载入
	 * @method  GET
	 * @author  Jason
	 * @date	2017年6月20日 下午4:55:14
	 *
	 * @param   number $id       ID，默认为 0，代表新增一条记录
	 * 			把参数按顺序辍到 URL 之后，用 "/" 间隔
	 * @example 如果参数为 id=202
	 * 			那么URL为 /manage/role/detail_action/202
	 * 
	 * @link    /manage/role/detail_action
	 * 
	 * @demoParam id 202
	 */
	public function detail_action($id = 0)
	{
		$action = $this->lib_role->get_action_for_detail($id);
		if (empty($action)) {
			$action = [];
		}
		
		$data['content']['action'] = $action;
		
		$this->load->view('manager/role/detail_action', $data);
	}
	
	
	/**
	 * ACL（访问控制列表）详情
	 *
	 * @desc    ACL详情（ACL => 访问控制列表） - 编辑前信息载入
	 * @method  GET
	 * @author  Jason
	 * @date	2017年6月20日 下午4:55:14
	 *
	 * @param   number $id       ID，默认为 0，代表新增一条记录
	 * 			把参数按顺序辍到 URL 之后，用 "/" 间隔
	 * @example 如果参数为 id=95
	 * 			那么URL为 /manage/role/detail_acl/95
	 * 
	 * @link    /manage/role/detail_acl
	 * 
	 * @demoParam id 24
	 */
	public function detail_acl($id = 0)
	{
		$acl = $this->lib_role->get_acl_for_detail($id);
		if (empty($acl)) {
			$acl = [];
		}
		
		$data['content']['acl'] = $acl;
		
		$this->load->view('manager/role/detail_acl', $data);
	}
	
	/**
	 * 角色详情编辑提交
	 *
	 * @desc    角色详情编辑提交 - 编辑完后的信息提交 - 增加 & 修改
	 * @method  POST
	 * @author  Jason
	 * @date	2017年5月24日 下午5:39:14
	 *
	 * @param   number $id	ID，默认为 0，代表增加 & 非0代表修改
	 * ...
	 *
	 * @return  JSON	标准JSON格式响应
	 * 					结构：无
	 *
	 * @link    /manage/role/ajax_create
	 * 
	 * @command noneurl
	 */
	public function ajax_create()
	{
		if (empty($id = $this->input->post('id'))) {
			list($status, $content) = $this->lib_role->create();
			$role_id = $content['id'];
		} else {
			$role_id = $id;
			list($status, $content) = $this->lib_role->update();
		}
		
		if ($status) {
			$_POST['role_id'] = $role_id;
			// MARK 如果你想验证多个数组，那么你应该在验证下一个新数组之前先调用 reset_validation() 方法。
			list($status, $content) = $this->lib_role->flush_acl();
		}
		
		if(!$status) {
			$messageContent = Lib_json::getMessageContent($content);
			Lib_json::renderError(Lib_json::ERROR_BUSINESS, current($content), $messageContent);
		} else {
			Lib_json::renderSuccess(['data' => $content], 'success');
		}
	}
	
	/**
	 * Action详情编辑提交
	 *
	 * @desc    Action详情编辑提交 - 编辑完后的信息提交 - 增加 & 修改
	 * @method  POST
	 * @author  Jason
	 * @date	2017年6月20日 下午5:17:41
	 *
	 * @param   number $id	ID，默认为 0，代表增加 & 非0代表修改
	 * ...
	 *
	 * @return  JSON	标准JSON格式响应
	 * 					结构：无
	 *
	 * @link    /manage/role/ajax_create_action
	 * 
	 * @command noneurl
	 */
	public function ajax_create_action()
	{
		if (empty($id = $this->input->post('id'))) {
			list($status, $content) = $this->lib_role->create('action');
		} else {
			list($status, $content) = $this->lib_role->update('action');
		}
		
		if(!$status) {
			$messageContent = Lib_json::getMessageContent($content);
			Lib_json::renderError(Lib_json::ERROR_BUSINESS, current($content), $messageContent);
		} else {
			Lib_json::renderSuccess(['data' => $content], 'success');
		}
	}
	
	/**
	 * 访问控制列表记录信息（ACL => 访问控制列表）
	 *
	 * @title 访问控制列表记录详情信息
	 * @desc    // TEMP ACL详情（ACL => 访问控制列表） - 编辑完后的信息提交 - 增加 & 修改
	 * @method  POST
	 * @author  Jason
	 * @date	2017年6月20日 下午5:17:41
	 *
	 * @param   number $id	ID，默认为 0，代表增加 & 非0代表修改
	 * ...
	 *
	 * @return  JSON	标准JSON格式响应
	 * 					结构：无
	 * 
	 * @link    /manage/role/ajax_create_acl
	 * 
	 * @command noneurl
	 */
	public function ajax_create_acl()
	{
		if (empty($id = $this->input->post('id'))) {
			list($status, $content) = $this->lib_role->create('acl');
		} else {
			list($status, $content) = $this->lib_role->update('acl');
		}
		
		if(!$status) {
			$messageContent = Lib_json::getMessageContent($content);
			Lib_json::renderError(Lib_json::ERROR_BUSINESS, current($content), $messageContent);
		} else {
			Lib_json::renderSuccess(['data' => $content], 'success');
		}
	}
	
	
	/**
	 * 角色状态切换
	 * 
	 * @desc    角色状态切换，可以切换角色的各种状态！
	 * @method  POST
	 * @author  Jason
	 * @date	2017年6月20日 下午5:04:37
	 *
	 * @param   number $id	用户ID
	 * @param   string $tag	状态正向标签，启用(enabled)、激活(activated)、审核(checked)、限制(unlimited)
	 *
	 * @return  JSON	标准JSON格式响应
	 *
	 * @link    /manager/role/ajax_toggle_status
	 * 
	 * @command noneurl
	 */
	public function ajax_toggle_status()
	{
		list($status, $content) = $this->lib_role->toggle_status_positive_tag();
		
		if(!$status) {
			Lib_json::renderError(Lib_json::ERROR_BUSINESS, current($content));
		} else {
			Lib_json::renderSuccess(['data' => $content]);
		}
	}
	
	/**
	 * 重建 Action
	 *
	 * @desc    重建 Action：从application目录中读取控制器的文件名和方法名，分别作为 ActionGroup 和 Action 的 CODE，名称则初始从注释中提取。
	 * @method  POST
	 * @author  Jason
	 * @date    2017年6月23日 下午4:45:37
	 * 
	 * @param   type variable
	 * 
	 * @return  JSON	标准JSON格式响应
	 * 
	 * @link    /manager/role/ajax_rebuild_action
	 * 
	 * @command noneurl
	 */
	public function ajax_rebuild_action()
	{
		list($status, $content) = $this->lib_role->rebuild_action_by_reflection();
		
		if(!$status) {
			Lib_json::renderError(Lib_json::ERROR_BUSINESS, current($content));
		} else {
			Lib_json::renderSuccess(['data' => $content]);
		}
	}
	
	// 不做软删除！
	
}
